package ru.spb.nicetu.altx.mnemo.cell;

import ru.spb.nicetu.altx.mnemo.extpoint.valuetypes.ITemplateValueType;
import ru.spb.nicetu.altx.mnemo.math.managers.ValueTypeClassManager;

/**
 * "Ячейка, связанная с Менеджером КлассовЗначенийДанных". Жестко связана с
 * классом ValueTypeClassManager для оперирования с реально загруженными
 * классами значений.
 */

@SuppressWarnings("serial")
public class ManagedNodeCell extends NodeCell {

  public ManagedNodeCell(String IDCell, String name, String valueClassName,
                         Categories category) {
    super(IDCell, name, valueClassName, category);
  }

  /**
   * Ссылка на Класс значений, не сериализуется.
   */
  @SuppressWarnings("unchecked")
  transient protected Class valueTypeClass = null;
  /**
   * Символическое имя Типа значений.
   */
  protected String valueTypeName = null;

  /**
   * !!! Символическое имя типа значения берется из реального класса значения
   * (который хранится в ValueTypeClassManager) !!!
   *
   * @return "Тип ячейки", или символическое имя типа значения, ассоциированного
   *         с этой ячейкой (напр. "Scalar").
   */

  @Override
  public String getValueTypeName() {
    calcValueTypeName();
    return this.valueTypeName;
  }


  @Override
  public INodeCell clone() {
    ManagedNodeCell copy = new ManagedNodeCell(getCellID(), getName(),
        getValueClassName(), getCategorie());
    copy.valueTypeClass = this.valueTypeClass;
    copy.valueTypeName = this.valueTypeName;

    return copy;
  }

  /**
   * !!! Символическое имя типа значения берется из реального класса значения
   * (который хранится в ValueTypeClassManager) !!!
   */
  @SuppressWarnings("unchecked")
  protected void calcValueTypeName() {
    if (this.valueTypeName != null)
      return;

    if (this.valueTypeClass == null) {
      this.valueTypeClass = ValueTypeClassManager.getInstance()
          .getValueTypeClass(getValueClassName());
    }
    Object objType = null;
    try {
      if (this.valueTypeClass != null)
        objType = this.valueTypeClass.newInstance();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    if (objType instanceof ITemplateValueType) {
      this.valueTypeName = ((ITemplateValueType) objType).getName();

    } else {
      this.valueTypeName = super.getValueTypeName();
    }
  }
}
